{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e5f5381c",
   "metadata": {},
   "source": [
    "## 2024机器智能 实验三"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "078afa96",
   "metadata": {},
   "outputs": [],
   "source": [
    "# File: 2024机器智能实验03_teacher.ipynb\n",
    "# License: MIT License \n",
    "# Copyright: (c) 2024 Rongxi Li <lirx67@mail2.sysu.edu.cn> \n",
    "# Created: 2024-03-10\n",
    "# Brief: 2024机器智能实验课教师版——实验三"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6839df93",
   "metadata": {},
   "source": [
    "### 必要依赖"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6362ff20",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Defaulting to user installation because normal site-packages is not writeable\n",
      "Requirement already satisfied: ipympl in c:\\programdata\\miniconda3\\lib\\site-packages (0.9.3)\n",
      "Requirement already satisfied: ipython<9 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipympl) (8.22.1)\n",
      "Requirement already satisfied: numpy in c:\\programdata\\miniconda3\\lib\\site-packages (from ipympl) (1.26.4)\n",
      "Requirement already satisfied: ipython-genutils in c:\\programdata\\miniconda3\\lib\\site-packages (from ipympl) (0.2.0)\n",
      "Requirement already satisfied: pillow in c:\\programdata\\miniconda3\\lib\\site-packages (from ipympl) (10.2.0)\n",
      "Requirement already satisfied: traitlets<6 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipympl) (5.14.1)\n",
      "Requirement already satisfied: ipywidgets<9,>=7.6.0 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipympl) (8.1.2)\n",
      "Requirement already satisfied: matplotlib<4,>=3.4.0 in c:\\programdata\\miniconda3\\lib\\site-packages (from ipympl) (3.8.3)\n",
      "Requirement already satisfied: decorator in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipython<9->ipympl) (5.1.1)\n",
      "Requirement already satisfied: jedi>=0.16 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipython<9->ipympl) (0.19.1)\n",
      "Requirement already satisfied: matplotlib-inline in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipython<9->ipympl) (0.1.6)\n",
      "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipython<9->ipympl) (3.0.43)\n",
      "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipython<9->ipympl) (2.17.2)\n",
      "Requirement already satisfied: stack-data in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipython<9->ipympl) (0.6.3)\n",
      "Requirement already satisfied: colorama in c:\\programdata\\miniconda3\\lib\\site-packages (from ipython<9->ipympl) (0.4.4)\n",
      "Requirement already satisfied: comm>=0.1.3 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipywidgets<9,>=7.6.0->ipympl) (0.2.1)\n",
      "Requirement already satisfied: widgetsnbextension~=4.0.10 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipywidgets<9,>=7.6.0->ipympl) (4.0.10)\n",
      "Requirement already satisfied: jupyterlab-widgets~=3.0.10 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from ipywidgets<9,>=7.6.0->ipympl) (3.0.10)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (1.2.0)\n",
      "Requirement already satisfied: cycler>=0.10 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (4.49.0)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (1.4.5)\n",
      "Requirement already satisfied: packaging>=20.0 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (23.0)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (3.1.1)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from matplotlib<4,>=3.4.0->ipympl) (2.8.2)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.3 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from jedi>=0.16->ipython<9->ipympl) (0.8.3)\n",
      "Requirement already satisfied: wcwidth in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython<9->ipympl) (0.2.13)\n",
      "Requirement already satisfied: six>=1.5 in c:\\programdata\\miniconda3\\lib\\site-packages (from python-dateutil>=2.7->matplotlib<4,>=3.4.0->ipympl) (1.16.0)\n",
      "Requirement already satisfied: executing>=1.2.0 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from stack-data->ipython<9->ipympl) (2.0.1)\n",
      "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from stack-data->ipython<9->ipympl) (2.4.1)\n",
      "Requirement already satisfied: pure-eval in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from stack-data->ipython<9->ipympl) (0.2.2)\n",
      "Defaulting to user installation because normal site-packages is not writeable\n",
      "Requirement already satisfied: numpy in c:\\programdata\\miniconda3\\lib\\site-packages (1.26.4)\n",
      "Defaulting to user installation because normal site-packages is not writeable\n",
      "Requirement already satisfied: matplotlib in c:\\programdata\\miniconda3\\lib\\site-packages (3.8.3)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (1.2.0)\n",
      "Requirement already satisfied: cycler>=0.10 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (4.49.0)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (1.4.5)\n",
      "Requirement already satisfied: numpy<2,>=1.21 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (1.26.4)\n",
      "Requirement already satisfied: packaging>=20.0 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (23.0)\n",
      "Requirement already satisfied: pillow>=8 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (10.2.0)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in c:\\programdata\\miniconda3\\lib\\site-packages (from matplotlib) (3.1.1)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\jungh\\appdata\\roaming\\python\\python311\\site-packages (from matplotlib) (2.8.2)\n",
      "Requirement already satisfied: six>=1.5 in c:\\programdata\\miniconda3\\lib\\site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install --upgrade ipympl\n",
    "!pip install numpy \n",
    "!pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1f9fd778",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib ipympl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "09f63ec1-fbd8-4e87-91b2-c3454558e91b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92fdfa64",
   "metadata": {},
   "source": [
    "### 遗传算法"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0bc8a6d",
   "metadata": {},
   "source": [
    "**绘图，不用看**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "714ec672",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_fitn(fitn_list, num=None):\n",
    "    \"\"\"绘制适应度变化图\n",
    "\n",
    "    Args:\n",
    "        his_fitn_list (list): 适应度历史列表\n",
    "    \"\"\"\n",
    "    fig, ax = plt.subplots(num=num)\n",
    "    ax.plot(fitn_list)\n",
    "    ax.set_title(\"fitn\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30ae9437",
   "metadata": {},
   "source": [
    "**遗传算法主要组成部分**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "494d34ba-b91b-44a6-912e-84659fc64eaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ctrbp(nind, dim, lind):\n",
    "    \"\"\"创建种群\n",
    "\n",
    "    Args:\n",
    "        nind (int): 种群规模\n",
    "        dim (int): 染色体维度\n",
    "        lind (int): 染色体长度\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 种群，三维数组，[nind, dim, lind]\n",
    "    \"\"\"\n",
    "    return np.random.randint(2, size=(nind, dim, lind))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6eff8d12-4aec-40d3-bcee-cdea2c41372e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:31: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:31: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "C:\\Users\\jungh\\AppData\\Local\\Temp\\ipykernel_3692\\508225298.py:31: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "  assert (chrom.shape == (nind, dim, lind), \"chrom shape error\")\n"
     ]
    }
   ],
   "source": [
    "def recombin(chrom, rec_opt):\n",
    "    \"\"\"染色体交叉重组，两点交叉算子\n",
    "\n",
    "    Args:\n",
    "        chrom (numpy.ndarray): 种群，三维数组，[nind, dim, lind]\n",
    "        rec_opt (float): 交叉概率，0-1\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 交叉后的种群，三维数组，[nind, dim, lind]\n",
    "    \"\"\"\n",
    "    nind, dim, lind = chrom.shape\n",
    "    rand_nind = np.arange(nind)[None, :].repeat(dim, axis=0)\n",
    "    for i in range(dim):\n",
    "        np.random.shuffle(rand_nind[i, :])\n",
    "    rand_nind_m = rand_nind[:, : nind // 2]\n",
    "    rand_nind_w = rand_nind[:, nind // 2 : nind // 2 * 2 + 1]\n",
    "    c_point_0 = np.random.randint(0, lind + 1, size=(dim, nind // 2))\n",
    "    c_point_1 = np.random.randint(0, lind + 1, size=(dim, nind // 2))\n",
    "\n",
    "    for i in range(dim):\n",
    "        for j in range(nind // 2):\n",
    "            if np.random.random() > rec_opt:\n",
    "                break\n",
    "            c_point_low = min(c_point_0[i, j], c_point_1[i, j])\n",
    "            c_point_up = max(c_point_0[i, j], c_point_1[i, j])\n",
    "            temp = chrom[rand_nind_m[i, j], i, c_point_low:c_point_up]\n",
    "            chrom[rand_nind_m[i, j], i, c_point_low:c_point_up] = chrom[\n",
    "                rand_nind_w[i, j], i, c_point_low:c_point_up\n",
    "            ]\n",
    "            chrom[rand_nind_w[i, j], i, c_point_low:c_point_up] = temp\n",
    "    assert (chrom.shape == (nind, dim, lind), \"chrom shape error\")\n",
    "    return chrom"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d7ca7919-4b95-4a49-ad61-7f0ff4f934b2",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:14: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:14: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "C:\\Users\\jungh\\AppData\\Local\\Temp\\ipykernel_3692\\1260015371.py:14: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "  assert(chrom.shape == (nind, dim, lind), \"chrom shape error\")\n"
     ]
    }
   ],
   "source": [
    "def mut(chrom, pm):\n",
    "    \"\"\"染色体变异\n",
    "\n",
    "    Args:\n",
    "        chrom (numpy.ndarray): 种群，三维数组，[nind, dim, lind]\n",
    "        pm (float): 变异概率，0-1\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 变异后的种群，三维数组，[nind, dim, lind]\n",
    "    \"\"\"\n",
    "    nind, dim, lind = chrom.shape\n",
    "    rand_mut = np.random.random(size=(chrom.shape)) < pm\n",
    "    chrom[rand_mut] = 1 - chrom[rand_mut]\n",
    "    assert(chrom.shape == (nind, dim, lind), \"chrom shape error\")\n",
    "    return chrom"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b86cddc1",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:20: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:20: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "C:\\Users\\jungh\\AppData\\Local\\Temp\\ipykernel_3692\\609783959.py:20: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "  assert (chrom.shape == (nind, dim, lind), \"chrom shape error\")\n"
     ]
    }
   ],
   "source": [
    "def select(chrom, fitn_v):\n",
    "    \"\"\"种群选择，轮盘赌法\n",
    "\n",
    "    Args:\n",
    "        chrom (numpy.ndarray): 种群，三维数组，[nind, dim, lind]\n",
    "        fitn_v (numpy.ndarray): 适应度值，一维数组，[nind]\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 选择后的种群，三维数组，[nind, dim, lind]\n",
    "    \"\"\"\n",
    "    nind, dim, lind = chrom.shape\n",
    "    fitness = fitn_v - fitn_v.max() - 1e-6\n",
    "    select_idx = np.array(\n",
    "        [np.random.choice(nind, p=fitness / fitness.sum()) for _ in range(nind * dim)]\n",
    "    )\n",
    "    select_idx = np.reshape(select_idx, (nind, dim))\n",
    "    new_chrom = np.array(\n",
    "        [chrom[:, i, :][select_idx[:, i]] for i in range(dim)]\n",
    "    ).transpose(1, 0, 2)\n",
    "    assert (chrom.shape == (nind, dim, lind), \"chrom shape error\")\n",
    "    return new_chrom"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "05938561-a6d3-42fe-9697-ded063e6073b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_dec(chrom):\n",
    "    \"\"\"二进制染色体转换为十进制\n",
    "\n",
    "    Args:\n",
    "        chrom (numpy.ndarray): 种群，三维数组，[nind, dim, lind]\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 十进制数值，二维数组，[nind, dim]\n",
    "    \"\"\"\n",
    "    nind, dim, lind = chrom.shape\n",
    "    binary_array = np.expand_dims(np.array([2**i for i in range(lind)]), 0)\n",
    "    binary_array = np.repeat(binary_array, repeats=dim * nind, axis=0)\n",
    "    binary_array = np.reshape(binary_array, (nind, dim, lind))\n",
    "    ret = np.sum(chrom * binary_array, axis=2)\n",
    "    return ret"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "aeaa1495-efa9-42bd-86fd-2b888421833d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:12: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:23: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:12: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:23: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "C:\\Users\\jungh\\AppData\\Local\\Temp\\ipykernel_3692\\411230509.py:12: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "  assert(len(boundary.shape) in [1, 2], \"boundary shape error\")\n",
      "C:\\Users\\jungh\\AppData\\Local\\Temp\\ipykernel_3692\\411230509.py:23: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "  assert(len(data.shape) == 2, \"data shape error\")\n"
     ]
    }
   ],
   "source": [
    "def get_decoder(boundary):\n",
    "    \"\"\"获取解码函数\n",
    "\n",
    "    Args:\n",
    "        boundary (numpy.ndarray): 各维度的边界。\n",
    "                二维数组，[dim, 2]，\n",
    "                当输入一维数组时将自动扩展，此时各维度的边界相同。\n",
    "\n",
    "    Returns:\n",
    "        FunctionType: 解码函数\n",
    "    \"\"\"\n",
    "    assert(len(boundary.shape) in [1, 2], \"boundary shape error\")\n",
    "    def _inner(data, lind):\n",
    "        \"\"\"解码函数\n",
    "\n",
    "        Args:\n",
    "            data (numpy.ndarray): 待解码十进制数据，二维数组，[nind, dim]\n",
    "            lind (int): 染色体长度\n",
    "\n",
    "        Returns:\n",
    "            numpy.ndarray: 解码后数据，二维数组，[nind, dim]\n",
    "        \"\"\"\n",
    "        assert(len(data.shape) == 2, \"data shape error\")\n",
    "        nonlocal boundary\n",
    "        if len(boundary.shape) == 1:\n",
    "            boundary = np.repeat(\n",
    "                np.expand_dims(boundary, 0), repeats=data.shape[1], axis=0\n",
    "            )\n",
    "        ret = data.transpose(1, 0) / 2**lind * (\n",
    "            np.expand_dims(boundary[:, 1], -1) - np.expand_dims(boundary[:, 0], -1)\n",
    "        ) + np.expand_dims(boundary[:, 0], -1)\n",
    "        return ret.transpose(1, 0)\n",
    "\n",
    "    return _inner"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13669e65",
   "metadata": {},
   "source": [
    "#### 3.1 遗传算法流程\n",
    "\n",
    "请使用以上给定的遗传算法主要组成部分，完成遗传算法的主要流程。\n",
    "\n",
    "本文使用了轮盘赌选择法；多点交叉算子；基本位变异法。学有余力者实现其他的选择、交叉、变异算法，如：\n",
    "\n",
    "选择：排序选择法、两两竞争法\n",
    "\n",
    "交叉：单点交叉算子、多点交叉算子、均匀交叉算子\n",
    "\n",
    "编译：均匀变异、边界变异、倒位变异"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "5abc757b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ga(nind, dim, lind, rec_opt, pm, max_iter, e, decode, get_fitn):\n",
    "    \"\"\"遗传算法\n",
    "\n",
    "    Args:\n",
    "        nind (int): 种群规模\n",
    "        dim (int): 染色体维度\n",
    "        lind (int): 染色体长度\n",
    "        rec_opt (float): 交叉概率\n",
    "        pm (float): 变异概率\n",
    "        max_iter (int): 最大迭代次数\n",
    "        e (float): 收敛误差\n",
    "        decode (FunctionType): 解码函数\n",
    "        get_fitn (FunctionType): 适应度函数\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 最优解，一维数组，[dim]\n",
    "        List: 每次迭代的最佳或平均适应度，[float]\n",
    "    \"\"\"\n",
    "    # 创建种群\n",
    "    # ...\n",
    "    his_fitn_list = []\n",
    "    ret = None\n",
    "\n",
    "    for iter in range(max_iter):\n",
    "        # 计算适应度与最优解\n",
    "        # ...\n",
    "        \n",
    "        # 判断是否收敛\n",
    "        # ...\n",
    "\n",
    "        # 选择、交叉、变异\n",
    "        # ...\n",
    "        pass\n",
    "\n",
    "    return ret, his_fitn_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "45a13420-4eaa-4fa6-bfa2-fa5d79dce124",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 答案\n",
    "def ga(nind, dim, lind, rec_opt, pm, max_iter, e, decode, get_fitn):\n",
    "    \"\"\"遗传算法\n",
    "\n",
    "    Args:\n",
    "        nind (int): 种群规模\n",
    "        dim (int): 染色体维度\n",
    "        lind (int): 染色体长度\n",
    "        rec_opt (float): 交叉概率\n",
    "        pm (float): 变异概率\n",
    "        max_iter (int): 最大迭代次数\n",
    "        e (float): 收敛误差\n",
    "        decode (FunctionType): 解码函数\n",
    "        get_fitn (FunctionType): 适应度函数\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 最优解，一维数组，[dim]\n",
    "        List: 每次迭代的适应度，[float]\n",
    "    \"\"\"\n",
    "    chrom = ctrbp(nind, dim, lind)\n",
    "    his_fitn_list = [float(\"inf\")]\n",
    "    ret = None\n",
    "\n",
    "    for iter in range(max_iter):\n",
    "        data = get_dec(chrom)\n",
    "        data = decode(data, lind)\n",
    "        fitn_v = get_fitn(data)\n",
    "        chrom_fitn = np.mean(fitn_v)\n",
    "        best_idx = np.argmin(fitn_v)\n",
    "        ret = data[best_idx, :]\n",
    "        if abs(his_fitn_list[-1] - chrom_fitn) < e:\n",
    "            break\n",
    "        his_fitn_list.append(chrom_fitn)\n",
    "\n",
    "        chrom = select(chrom, fitn_v)\n",
    "        chrom = recombin(chrom, rec_opt)\n",
    "        chrom = mut(chrom, pm)\n",
    "\n",
    "    return ret, his_fitn_list[1:]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f16b089",
   "metadata": {},
   "source": [
    "**适应度函数**\n",
    "\n",
    "以下适应度函数用于求解$\\min f(x)=x^2$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "32d5dabb-acac-4b8f-a268-7c55541d5e12",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:11: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "<>:11: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "C:\\Users\\jungh\\AppData\\Local\\Temp\\ipykernel_3692\\3006707732.py:11: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n",
      "  assert(ret.shape == (data.shape[0],), \"fitn shape error\")\n"
     ]
    }
   ],
   "source": [
    "def get_fitn_demo(data):\n",
    "    \"\"\"适应度函数示例\n",
    "\n",
    "    Args:\n",
    "        data (numpy.ndarray): 解码后数据，二维数组，[nind, dim]\n",
    "\n",
    "    Returns:\n",
    "        numpy.ndarray: 适应度值，一维数组，[nind,]\n",
    "    \"\"\"    \n",
    "    ret = data[:, 0] ** 2\n",
    "    \n",
    "    assert(ret.shape == (data.shape[0],), \"fitn shape error\")\n",
    "    return ret"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c62652fa-cbc9-47c7-bf6d-60577fdfc1b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "value: [-0.0078125]\n",
      "iter: 55\n",
      "fitn: 0.00013427734375\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "eec85260d379465799f1c47099d5c38a",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "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",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ret, fitn = ga(20, 1, 8, 0.8, 0.01, 100, 1e-4, get_decoder(np.array([-1, 1])), get_fitn_demo)\n",
    "print(f\"value: {ret}\")\n",
    "print(f\"iter: {len(fitn)}\")\n",
    "print(f\"fitn: {fitn[-1]}\")\n",
    "plot_fitn(fitn)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7fd1b119",
   "metadata": {},
   "source": [
    "#### 3.2 极值搜索\n",
    "\n",
    "##### 3.2.1 请通过遗传算法求解以下极小值与极大值\n",
    "\n",
    "$f(x,y) = 3(1-x)^2\\exp{[-x^2-(y+1)^2]}-10(\\frac{x}{5}-x^3-y^5)\\exp{(-x^2-y^2)}-\\frac{1}{3}\\exp{[-(x+1)^2-y^2]}$\n",
    "\n",
    "其中：\n",
    "\n",
    "$-2.048 \\le x,y \\le 2.048$\n",
    "\n",
    "参考答案(近似值):\n",
    "\n",
    "$x=0.26 \\\\ y=-1.61$\n",
    "\n",
    "##### 2.2.2 通过遗传算法求解以下极值问题\n",
    "\n",
    "$\\min{f(x)=100(x^2-y)^2+(1-x)^2}$\n",
    "\n",
    "1. 无约束情况时求解\n",
    "   \n",
    "   参考答案：$x=1,\\; y=1$\n",
    "\n",
    "2. 存在以下两个非线性约束条件和限制条件时求解\n",
    "   \n",
    "   $\\begin{cases} xy+x-y+1.5\\le0\\\\10-xy\\le0\\\\0\\le x\\le1\\\\0\\le y\\le13 \\end{cases}$\n",
    "\n",
    "   参考答案：$x=0.8122,\\; y=12.3122$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "45ce9c57-a859-4928-8424-980d828c04b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_fitn_t11(data):\n",
    "    x = data[:, 0]\n",
    "    y = data[:, 1]\n",
    "    return (\n",
    "        3 * (1 - x) ** 2 * np.exp(-(x**2) - (y + 1) ** 2)\n",
    "        - 10 * (x / 5 - x**3 - y**5) * np.exp(-(x**2) - y**2)\n",
    "        - 1 / 3 * np.exp(-((x + 1) ** 2) - y**2)\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2a762828-f1b5-43c7-93d3-fed9693eade4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "value: [-1.323625  0.211375]\n",
      "iter: 203\n",
      "fitn: -2.772950561224896\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b3f6ddf129d542379b9e36029728dfa6",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxtElEQVR4nO3dd3hb5dk/8O+RbMmWh7xXYidxAhlkgUNMwgpNmgR4C7yEsNJCKCRA6SIphfBroXSFAgXetswWEmYptMxCgSxCIZPs6cRZjp14xEuessb5/SE9R0eyZEu2bK3v57p8JZaP7EeWfHSf+7mf+5FkWZZBRERERDFDE+oBEBEREdHgYgBIREREFGMYABIRERHFGAaARERERDGGASARERFRjGEASERERBRjGAASERERxRgGgEREREQxhgEgERERUYxhAEhEREQUYxgAEhEREcUYBoBEREREMYYBIBEREVGMYQBIREREFGMYABIRERHFGAaARERERDGGASARERFRjGEASERERBRjGAASERERxRgGgEREREQxhgEgERERUYxhAEhEREQUYxgAEhEREcUYBoBEREREMYYBIBEREVGMYQBIREREFGMYABIRERHFGAaARERERDGGASARERFRjGEASERERBRjGAASERERxRgGgEREREQxhgEgERERUYxhAEhEREQUYxgAElFM2bp1K6ZPn46kpCRIkoRrrrkGkiSFelhERIMqLtQDICIaLBaLBfPnz0dCQgKeeuopGAwGbN26tdtxv//97zFu3Dhcc801gz9IIqJBIMmyLId6EEREg+HgwYMYO3Ys/vrXv+KOO+4AAFitVlitViQkJCjHJScn47rrrsPKlStDNFIiooHFDCARxYza2loAQFpamnJbXFwc4uJ4KiSi2MIaQCKKCQsXLsSll14KAJg/fz4kScKMGTPwq1/9yq0GUJIktLW14ZVXXoEkSZAkCQsXLgQA5djy8nIsXLgQaWlpMBqNuO2229De3h6Kh0VE1Ce87CWimHDnnXdiyJAh+P3vf48f//jHOP/885Gbm4uvv/7a7bjXXnsNd9xxB6ZOnYrFixcDAEaOHOl2zPXXX48RI0Zg+fLl2L59O/72t78hJycHf/jDHwbt8RAR9QcDQCKKCdOmTYPZbMbvf/97XHzxxbjuuusAoFsA+N3vfhd33XUXiouL8d3vftfr9zr33HPx0ksvKZ/X19fjpZdeYgBIRBGDU8BERAG666673D6/+OKLUV9fD5PJFKIREREFhgEgEVGAioqK3D5PT08HADQ2NoZiOEREAWMASEQUIK1W6/V2dtUiokjBAJCIyAN3BiGiaMcAkIjIQ1JSEpqamkI9DCKiAcNVwEREHkpKSrB69Wo8+eSTKCgowIgRI1BaWhrqYRERBQ0zgEREHp588kmUlJTgF7/4BW666SY899xzoR4SEVFQcS9gIiIiohjDDCARERFRjGEASERERBRjGAASERERxRgGgEREREQxhgEgERERUYxhAEhEREQUYxgAEhEREcUY7gTSD3a7HadOnUJKSgr3DiUiIooQsiyjpaUFBQUF0GhiMxfGALAfTp06hcLCwlAPg4iIiPrg5MmTGDp0aKiHERIMAPshJSUFgOMFlJqaGuLREBERkT9MJhMKCwuV9/FYxACwH8S0b2pqKgNAIiKiCBPL5VuxOfFNREREFMMYABIRERHFGAaARERERDGGASARERFRjGEASERERBRjGAASERERxRgGgEREREQxhgEgERERUYxhAEhEREQUYxgAEhEREcUYBoBEREREMYYBIBEREVGMYQAYxmx2Gc9+UY4txxpCPRQiIiKKIgwAw9j7O6rw2Kdl+N3H+0M9FCIiIooiDADD2Ps7qwAApk5riEdCRERE0YQBYJiqMXXi6/IzAIAuqz3EoyEiIqJowgAwTH206xTssuP/XTYGgERERBQ8DADDlJj+BZgBJCIiouBiABiGDte0YG+VSfmcASAREREFEwPAMCSyf+OHpAIALJwCJiIioiBiABiGzitKx2Wjs3Hj+UUAAKtdhl0UBBIRERH1EwPAMDRzbC5W3DYVV08uUG7jQhAiIiIKFgaAYUwX53p6zKwDJCIioiBhABjGdFrX08M6QCIiIgoWBoBhTJIkxGslAFwJTERERMHDADDMiSwgA0AiIiIKFgaAYU7UAXIRCBEREQULA8AwpwSAzAASERFRkDAADHPMABIREVGwRVUA+Mwzz2D48OFISEhAaWkptmzZ4vPYlStXQpIkt4+EhIRBHK1/4lkDSEREREEWNQHgP/7xDyxZsgQPP/wwtm/fjkmTJmHOnDmora31eZ/U1FScPn1a+Thx4sQgjtg/XARCREREwRY1AeCTTz6JRYsW4bbbbsO4cePw/PPP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",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ret, fitn = ga(\n",
    "    50,\n",
    "    2,\n",
    "    16,\n",
    "    0.8,\n",
    "    0.01,\n",
    "    1000,\n",
    "    1e-3,\n",
    "    get_decoder(np.array([-2.048, 2.048])),\n",
    "    get_fitn_t11,\n",
    ")\n",
    "print(f\"value: {ret}\")\n",
    "print(f\"iter: {len(fitn)}\")\n",
    "print(f\"fitn: {fitn[-1]}\")\n",
    "plot_fitn(fitn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "a764e60b-9d6f-4023-9a16-b5acfdc6ce49",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_fitn_t12(data):\n",
    "    x = data[:, 0]\n",
    "    y = data[:, 1]\n",
    "    return (\n",
    "        -3 * (1 - x) ** 2 * np.exp(-(x**2) - (y + 1) ** 2)\n",
    "        - 10 * (x / 5 - x**3 - y**5) * np.exp(-(x**2) - y**2)\n",
    "        - 1 / 3 * np.exp(-((x + 1) ** 2) - y**2)\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8a1f56b1-cdb1-40c3-9588-d9867399c9ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "value: [-0.2835625 -1.43175  ]\n",
      "iter: 40\n",
      "fitn: -10.004797703174106\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "39f2be5d141c4f1c98180e2eb38cc20f",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "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9ufMmTMtStw0L7/8soYMGVI3QXBCQoK+/PLLusfdYV9KZ95Od9iXP/Xkk0/KMAzdd999dfe5y/5sbRTAdubdd9/VAw88oLlz52rTpk0aOnSoLrzwQmVnZ1sdrUUNGjRIGRkZdbdVq1ZZHanZiouLNXToUP39738/6eNPPfWUXnzxRb3yyitau3atOnXqpAsvvFBlZWVtnLR5zrSdknTRRRfV27/vvPNOGyZsvuXLl2vWrFn6/vvvtXjxYlVWVmrKlCkqLi6ue87999+vzz77TO+//76WL1+u9PR0XXnllRambryGbKck3XHHHfX251NPPWVR4qaJjo7Wk08+qY0bN2rDhg2aOHGipk6dqh07dkhyj30pnXk7pY6/L39s/fr1evXVVzVkyJB697vL/mx1JtqVUaNGmbNmzar7u7q62oyKijLnzZtnYaqWNXfuXHPo0KFWx2hVksyPP/647m+Xy2VGRkaaTz/9dN19eXl5ptPpNN955x0LEraMn26naZrmLbfcYk6dOtWSPK0lOzvblGQuX77cNM2afefl5WW+//77dc/ZtWuXKclcs2aNVTGb7afbaZqmef7555v33nuvdaFaSUhIiPnaa6+57b6sVbudpule+7KwsNDs27evuXjx4nrb5e77syVxBLAdqaio0MaNGzV58uS6+xwOhyZPnqw1a9ZYmKzl7dmzR1FRUYqNjdUNN9yg1NRUqyO1qpSUFGVmZtbbt0FBQRo9erTb7VtJ+vbbbxUeHq7+/fvr7rvvVm5urtWRmiU/P1+S1LlzZ0nSxo0bVVlZWW9/xsXFqXv37h16f/50O2v997//VWhoqM466yzNmTNHJSUlVsRrEdXV1VqwYIGKi4uVkJDgtvvyp9tZy1325axZs3TppZfW22+S+/672Ro8rQ6AHxw5ckTV1dWKiIiod39ERISSkpIsStXyRo8erfnz56t///7KyMjQH//4R40dO1bbt29XQECA1fFaRWZmpiSddN/WPuYuLrroIl155ZXq1auX9u3bp0ceeUQXX3yx1qxZIw8PD6vjNZrL5dJ9992nMWPG6KyzzpJUsz+9vb0VHBxc77kdeX+ebDsl6frrr1ePHj0UFRWlrVu36uGHH1ZycrI++ugjC9M23rZt25SQkKCysjL5+/vr448/1sCBA5WYmOhW+/JU2ym5z75csGCBNm3apPXr15/wmDv+u9laKIBocxdffHHd/x4yZIhGjx6tHj166L333tPtt99uYTK0hOuuu67ufw8ePFhDhgxR79699e2332rSpEkWJmuaWbNmafv27W5xnerpnGo777zzzrr/PXjwYHXt2lWTJk3Svn371Lt377aO2WT9+/dXYmKi8vPz9cEHH+iWW27R8uXLrY7V4k61nQMHDnSLfXno0CHde++9Wrx4sXx8fKyO06FxCrgdCQ0NlYeHxwmjlbKyshQZGWlRqtYXHBysfv36ae/evVZHaTW1+89u+1aSYmNjFRoa2iH37z333KPPP/9cy5YtU3R0dN39kZGRqqioUF5eXr3nd9T9eartPJnRo0dLUofbn97e3urTp4/i4+M1b948DR06VC+88ILb7ctTbefJdMR9uXHjRmVnZ2vEiBHy9PSUp6enli9frhdffFGenp6KiIhwq/3ZmiiA7Yi3t7fi4+P1zTff1N3ncrn0zTff1LuGw90UFRVp37596tq1q9VRWk2vXr0UGRlZb98WFBRo7dq1br1vJenw4cPKzc3tUPvXNE3dc889+vjjj7V06VL16tWr3uPx8fHy8vKqtz+Tk5OVmpraofbnmbbzZBITEyWpQ+3Pk3G5XCovL3ebfXkqtdt5Mh1xX06aNEnbtm1TYmJi3W3kyJG64YYb6v63O+/PFmX1KBTUt2DBAtPpdJrz5883d+7cad55551mcHCwmZmZaXW0FvPggw+a3377rZmSkmKuXr3anDx5shkaGmpmZ2dbHa1ZCgsLzc2bN5ubN282JZnPPfecuXnzZvPgwYOmaZrmk08+aQYHB5sLFy40t27dak6dOtXs1auXWVpaanHyxjnddhYWFpq/+c1vzDVr1pgpKSnmkiVLzBEjRph9+/Y1y8rKrI7eYHfffbcZFBRkfvvtt2ZGRkbdraSkpO45M2fONLt3724uXbrU3LBhg5mQkGAmJCRYmLrxzrSde/fuNR9//HFzw4YNZkpKirlw4UIzNjbWHDdunMXJG2f27Nnm8uXLzZSUFHPr1q3m7NmzTcMwzEWLFpmm6R770jRPv53usi9P5qejm91lf7Y2CmA79NJLL5ndu3c3vb29zVGjRpnff/+91ZFa1LXXXmt27drV9Pb2Nrt162Zee+215t69e62O1WzLli0zJZ1wu+WWW0zTrJkK5ve//70ZERFhOp1Oc9KkSWZycrK1oZvgdNtZUlJiTpkyxQwLCzO9vLzMHj16mHfccUeH+w+Yk22fJPONN96oe05paan5y1/+0gwJCTH9/PzMn/3sZ2ZGRoZ1oZvgTNuZmppqjhs3zuzcubPpdDrNPn36mA899JCZn59vbfBGuu2228wePXqY3t7eZlhYmDlp0qS68mea7rEvTfP02+ku+/JkfloA3WV/tjbDNE2z7Y43AgAAwGpcAwgAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM1QAAEAAGyGAggAAGAzFEAAAACboQACAADYDAUQAADAZiiAAAAANkMBBAAAsBkKIAAAgM38f6BCIAOfTnViAAAAAElFTkSuQmCC",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ret, fitn = ga(\n",
    "    50,\n",
    "    2,\n",
    "    16,\n",
    "    0.8,\n",
    "    0.01,\n",
    "    1000,\n",
    "    1e-2,\n",
    "    get_decoder(np.array([-2.048, 2.048])),\n",
    "    get_fitn_t12,\n",
    ")\n",
    "print(f\"value: {ret}\")\n",
    "print(f\"iter: {len(fitn)}\")\n",
    "print(f\"fitn: {fitn[-1]}\")\n",
    "plot_fitn(fitn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c421cede-ab56-42a3-b779-0f9574206a56",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_fitn_t21(data):\n",
    "    x = data[:, 0]\n",
    "    y = data[:, 1]\n",
    "    return 100 * (x**2 - y) ** 2 + (1 - x) ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d0bda2fe-5036-40b5-98aa-8a2b6d0b308b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "value: [0.87051392 0.76605225]\n",
      "iter: 82\n",
      "fitn: 0.04465531304020137\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1bfab0f0816e4d9ea0bbd307c2444999",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "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Vpdeeqkk+//bvPnmm1VfX6+xY8fK5XIpGAzqpz/9qebOnSupf70v2AEBEOih+fPna/369XrzzTf7+lRS6uijj9aaNWtUV1env/71r5o3b56WLl3a16fVYzt37tQ111yjxYsXKzs7u69PJ+XMaookTZo0SdOnT9fIkSP1l7/8RTk5OX14ZqkRCoU0depU3XPPPZKkyZMna/369Xr44Yc1b968Pj671Hrsscc0a9YslZeX9/WppMRf/vIXPfXUU1q4cKGOOeYYrVmzRtdee63Ky8v73XNnBwwBp5HBgwfL5XIdtKKrqqpKZWVlfXRWvcO8Hrtf61VXXaVFixbp9ddf17Bhw6zby8rK5Pf7VVtbG3O8na7P4/HoiCOO0JQpU7RgwQIde+yx+vWvf237a1u9erWqq6t13HHHye12y+12a+nSpfrNb34jt9ut0tJSW19fe0VFRTrqqKO0detW2z93kjR06FCNHz8+5rZx48ZZw9z95bXl008/1b/+9S9997vftW6z+/N3ww036Oabb9aFF16oiRMn6uKLL9Z1112nBQsWSOo/z51dEADTiMfj0ZQpU7RkyRLrtlAopCVLlqiioqIPzyz1Ro0apbKysphrra+v14oVK2xxrYZh6KqrrtKzzz6r1157TaNGjYq5f8qUKcrKyoq5vs2bN2vHjh22uL54QqGQfD6f7a/t9NNP17p167RmzRrra+rUqZo7d671ZztfX3uNjY3atm2bhg4davvnTpJOOumkg1ouffTRRxo5cqQk+7+2mB5//HGVlJRo9uzZ1m12f/6am5vldMbGDpfLpVAoJKn/PHe20derUBDr6aefNrxer/HEE08YGzduNC6//HKjqKjIqKys7OtTS1pDQ4Px/vvvG++//74hybjvvvuM999/3/j0008Nwwgv9y8qKjKef/55Y+3atcY555xjm+X+V155pVFYWGi88cYbMS0bmpubrWOuuOIKY8SIEcZrr71mrFq1yqioqDAqKir68KwTd/PNNxtLly41tm/fbqxdu9a4+eabDYfDYbz66quGYdj72uKJXgVsGPa+vh/+8IfGG2+8YWzfvt146623jBkzZhiDBw82qqurDcOw97UZRrh1j9vtNn76058aW7ZsMZ566ikjNzfX+OMf/2gdY+fXFsMId38YMWKEcdNNNx10n52fv3nz5hmHHXaY1Qbm73//uzF48GDjxhtvtI6x+3NnJwTANPTAAw8YI0aMMDwej3H88ccb77zzTl+fUre8/vrrhqSDvubNm2cYRnjJ/49//GOjtLTU8Hq9xumnn25s3ry5b086QfGuS5Lx+OOPW8ccOHDA+P73v28MHDjQyM3NNf7jP/7D2L17d9+ddBK+853vGCNHjjQ8Ho8xZMgQ4/TTT7fCn2HY+9riaR8A7Xx93/jGN4yhQ4caHo/HOOyww4xvfOMbMT3y7HxtphdeeMGYMGGC4fV6jbFjxxqPPPJIzP12fm0xDMN45ZVXDElxz9nOz199fb1xzTXXGCNGjDCys7ON0aNHGz/60Y8Mn89nHWP3585OHIYR1YIbAAAA/R5zAAEAADIMARAAACDDEAABAAAyDAEQAAAgwxAAAQAAMgwBEAAAIMMQAAEAADIMARAAACDDEAABAAAyDAEQAAAgwxAAAQAAMgwBEAAAIMMQAAEAADIMARAAACDDEAABAAAyDAEQAAAgwxAAAQAAMgwBEAAAIMMQAAEAADIMARAAACDDEAABAAAyDAEQAAAgwxAAAQAAMgwBEAAAIMMQAAEAADIMARAAACDDEAABAAAyDAEQAAAgwxAAAQAAMgwBEAAAIMMQAAEAADLM/wdPvQ+6TcKBgAAAAABJRU5ErkJggg==",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ret, fitn = ga(10, 2, 16, 0.6, 0.01, 10000, 1e-2, get_decoder(np.array([0, 2])), get_fitn_t21)\n",
    "print(f\"value: {ret}\")\n",
    "print(f\"iter: {len(fitn)}\")\n",
    "print(f\"fitn: {fitn[-1]}\")\n",
    "plot_fitn(fitn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b4a19020-a313-413f-bce8-22b6512f7ea9",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_fitn_t22(data):\n",
    "    x = data[:, 0]\n",
    "    y = data[:, 1]\n",
    "    cons_0 = x * y + x - y + 1.5\n",
    "    cons_1 = 10 - x * y\n",
    "    cons_0[cons_0 < 0] = 0\n",
    "    cons_1[cons_1 < 0] = 0\n",
    "    return 100 * (x**2 - y) ** 2 + (1 - x) ** 2 + 1e4 * (cons_0**2 + cons_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "9c3782ff-e882-43d2-8cf5-2b006574773e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "value: [ 0.74949646 12.98750305]\n",
      "iter: 74\n",
      "fitn: 18896.85640077726\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0ffa0b86f39f4b5290caa69251e0baee",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABtAUlEQVR4nO3dd3iUVd4+8HtKZlInvZBKqCGUAEFiBFQkEtm8rigquqhIUeENK2XX9lsFyyournWl2OFdK7hrARTEIKASWui9BRIIk0oyIW2SmfP7Y/I8ZCCdZCYzc3+uK5dk5uSZ8yTI3DnlexRCCAEiIiIichlKe3eAiIiIiGyLAZCIiIjIxTAAEhEREbkYBkAiIiIiF8MASERERORiGACJiIiIXAwDIBEREZGLYQAkIiIicjEMgEREREQuhgGQiIiIyMUwABIRERG5GAZAIiIiIhfDAEhERETkYhgAiYiIiFwMAyARERGRi2EAJCIiInIxDIBERERELoYBkIiIiMjFMAASERERuRgGQCIiIiIXwwBIRERE5GIYAImIiIhcDAMgERERkYthACQiIiJyMQyARERERC6GAZCIiIjIxTAAEhEREbkYBkAiIiIiF8MASERERORiGACJiIiIXAwDIBEREZGLYQAkIiIicjEMgEREREQuhgGQiIiIyMUwABKRS9m5cyduuOEGeHl5QaFQYPz48VAoFPbuFhGRTant3QEiIlupra3FPffcA3d3d7z55pvw9PTEzp07r2r3yiuvID4+HuPHj7d9J4mIbEAhhBD27gQRkS0cPXoU/fr1wwcffIDp06cDAOrq6lBXVwd3d3e5nbe3N+6++24sX77cTj0lIupcHAEkIpdRUFAAAPDz85MfU6vVUKv5TyERuRauASQil/Dwww/jpptuAgDcc889UCgUuPnmm/H8889brQFUKBSoqKjAihUroFAooFAo8PDDDwOA3PbkyZN4+OGH4efnB19fX0yZMgWVlZX2uC0ionbhr71E5BIee+wxRERE4JVXXsHjjz+O6667DqGhofj999+t2v373//G9OnTMXz4cDz66KMAgJ49e1q1uffeexEbG4uFCxdi9+7d+PDDDxESEoJ//OMfNrsfIqJrwQBIRC4hOTkZNTU1eOWVVzBq1CjcfffdAHBVAHzggQcwY8YM9OjRAw888ECj1xoyZAg++ugj+fPi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8ssviIyMlB8PCwuD0WhEaWmpVXtnuG+NRoNevXohMTERCxcuREJCAt5++22nvuesrCwUFBRg6NChUKvVUKvV2Lx5M9555x2o1WqEhoY67b035Ofnhz59+uDkyZNO+/Pu1q0b4uPjrR7r16+fPPXt7P+mnT17Fj///DOmT58uP+asP2tnwwDYhWg0GiQmJiIjI0N+zGw2IyMjA8nJyXbsme3ExsYiLCzM6ntgMBiwfft2h/4eCCEwa9YsfPPNN9i4cSNiY2Otnk9MTISbm5vVfR87dgw5OTkOfd+NMZvNqKmpcep7HjNmDA4cOIC9e/fKH8OGDcOkSZPkPzvrvTd06dIlnDp1Ct26dXPan/eIESOuKul0/PhxxMTEAHDef9Mkn3zyCUJCQpCWliY/5qw/a6dj710oZO3LL78UWq1WLF++XBw+fFg8+uijws/PT+j1ent3rcOUl5eLPXv2iD179ggA4o033hB79uwRZ8+eFUII8eqrrwo/Pz/x3Xffif3794s77rhDxMbGiqqqKjv3vP1mzpwpfH19xaZNm8SFCxfkj8rKSrnNjBkzRHR0tNi4caPYtWuXSE5OFsnJyXbs9bV7+umnxebNm0V2drbYv3+/ePrpp4VCoRA//fSTEMI577kpDXcBC+Gc9/6Xv/xFbNq0SWRnZ4vff/9dpKSkiKCgIFFQUCCEcM573rFjh1Cr1eLll18WJ06cEJ999pnw9PQUn376qdzGGf9NE8JSpSI6Olo89dRTVz3njD9rZ8MA2AX961//EtHR0UKj0Yjhw4eLbdu22btLHeqXX34RAK76mDx5shDCUjbhueeeE6GhoUKr1YoxY8aIY8eO2bfT16ix+wUgPvnkE7lNVVWV+N///V/h7+8vPD09xZ133ikuXLhgv053gKlTp4qYmBih0WhEcHCwGDNmjBz+hHDOe27KlQHQGe994sSJolu3bkKj0YiIiAgxceJEcfLkSfl5Z7xnIYRYvXq1GDBggNBqtSIuLk68//77Vs87479pQgixfv16AaDRe3HWn7UzUQghhF2GHomIiIjILrgGkIiIiMjFMAASERERuRgGQCIiIiIXwwBIRERE5GIYAImIiIhcDAMgERERkYthACQiIiJyMQyARERERC6GAZCIiIjIxTAAEhEREbkYBkAiIiIiF8MASERERORiGACJiIiIXAwDIBEREZGLYQAkIiIicjEMgEREREQuhgGQiIiIyMUwABIRERG5GAZAIiIiIhfDAEhERETkYhgAiYiIiFwMAyARERGRi2EAJCIiInIxDIBERERELoYBkIiIiMjFMAASERERuRgGQCIiIiIXwwBIRERE5GIYAImIiIhcDAMgERERkYthACQiIiJyMf8fZ1MZtEoiHMQAAAAASUVORK5CYII=",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ret, fitn = ga(\n",
    "    10,\n",
    "    2,\n",
    "    16,\n",
    "    0.6,\n",
    "    0.01,\n",
    "    10000,\n",
    "    0.5,\n",
    "    get_decoder(np.array([[0, 1], [0, 13]])),\n",
    "    get_fitn_t22,\n",
    ")\n",
    "print(f\"value: {ret}\")\n",
    "print(f\"iter: {len(fitn)}\")\n",
    "print(f\"fitn: {fitn[-1]}\")\n",
    "plot_fitn(fitn)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "10bb6300",
   "metadata": {},
   "source": [
    "#### 3.3 非线性函数拟合\n",
    "\n",
    "假设有观测时间数据$x^*$和观测响应数据$y^*$，要求拟合以下形式的非线性函数模型，其中 a 和 b 为代求参数。\n",
    "\n",
    "$y=ae^{bx}$\n",
    "\n",
    "$\n",
    "𝑥^∗=[0.9,1.5,13.8,19.8,24.1,28.2,35.2,60.3,74.6,81.3]$\n",
    "\n",
    "$\n",
    "𝑦^∗=[455.2,428.6,124.1,67.3,43.2,28.1,13.1,−0.4,−1.3,−1.5]\n",
    "$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "0937c63b-e62e-44be-b550-39672cb56ba8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_fitn_t3(data):\n",
    "    a = data[:, 0]\n",
    "    b = data[:, 1]\n",
    "    xs = np.array([0.9, 1.5, 13.8, 19.8, 24.1, 28.2, 35.2, 60.3, 74.6, 81.3])\n",
    "    ys = np.array([455.2, 428.6, 124.1, 67.3, 43.2, 28.1, 13.1, -0.4, -1.3, -1.5])\n",
    "    cost = 0\n",
    "    for x, y in zip(xs, ys):\n",
    "        cost += (a * np.exp(b * x) - y) ** 2\n",
    "    return cost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "5690fb42-33bd-49aa-bf18-1a6973b4d8fd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "value: [ 5.11136709e+02 -1.13285541e-01]\n",
      "iter: 31\n",
      "fitn: 1027.658034211445\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a602145e28ae42fe9a1c0296cc0bdd99",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "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",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ret, fitn = ga(\n",
    "    20,\n",
    "    2,\n",
    "    32,\n",
    "    0.6,\n",
    "    0.01,\n",
    "    10000,\n",
    "    100,\n",
    "    get_decoder(np.array([[400, 600], [-0.2, 0.2]])),\n",
    "    get_fitn_t3,\n",
    ")\n",
    "print(f\"value: {ret}\")\n",
    "print(f\"iter: {len(fitn)}\")\n",
    "print(f\"fitn: {fitn[-1]}\")\n",
    "plot_fitn(fitn)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
